#include<iostream>
#include<vector>
using namespace std;
/*
有效 IP 地址 正好由四个整数（每个整数位于 0 到 255 之间组成，且不能含有前导 0），整数之间用 '.' 分隔。

例如："0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址，
但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ，用以表示一个 IP 地址，返回所有可能的有效 IP 地址，这些地址可以通过在 s 中插入 '.' 来形成。
你不能重新排序或删除s中的任何数字。你可以按 任何 顺序返回答案。

*/
vector<string> result;
bool isvalid(string s,int start,int end)
{
    if (start > end) {
            return false;
        }
        if (s[start] == '0' && start != end) { // 0开头的数字不合法
                return false;
        }
        int num = 0;
        for (int i = start; i <= end; i++) {
            if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合法
                return false;
            }
            num = num * 10 + (s[i] - '0');
            if (num > 255) { // 如果大于255了不合法
                return false;
            }
        }
        return true;
}
void backtracking(string s,int index,int sum)
{
    //递归终止条件
    if(sum==3)
    {
        //若是ip分隔符为三的话，就不需要在进行分隔了，此时应该判断最后一个分隔的字符串是否合法
        if(isvalid(s,index,s.size()-1))
        {
            result.push_back(s);
        }
    }
    for(int i=index;i<s.size();i++)
    {
        if(isvalid(s,index,i))
        {
            s.insert(s.begin()+i+1,'.');
            sum+=1;
            backtracking(s,i+2,sum);
            s.erase(s.begin()+i+1);
            sum-=1;
        }
    }
}
vector<string> restoreIpAddresses(string s){
    backtracking(s,0,0);
    return result;
}   
int main()
{
    cout<<"enter s:"<<endl;
    string s;
    cin>>s;
    result = restoreIpAddresses(s);
    for(int i=0;i<result.size();i++)
    {
        cout<<result[i]<<endl;
    }
    return 0;
}